package com.ikun.common.search.utils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName ReflexUtils
 * @Description: 反射工具类
 * @CreateDate: 2024/7/28 17:13
 */
public class ReflexUtils {

    /**
     *  组装get方法
     * @param fieldName
     * @return
     */
    public static String getGetMethodNameByField(String fieldName) {
        String methodName = new StringBuilder("get")
                .append(fieldName.substring(0, 1).toUpperCase())
                .append(fieldName.substring(1)).toString();
        return methodName;
    }

    /**
     * 组装set方法
     * @param fieldName
     * @return
     */
    public static String getSetMethodNameByField(String fieldName) {
        String methodName = new StringBuilder("set")
                .append(fieldName.substring(0, 1).toUpperCase())
                .append(fieldName.substring(1)).toString();
        return methodName;
    }

    /**
     * 获取一个类所有的字段 包括父类定义的字段
     *
     * @return
     */
    public static List<Field> getAllFields(Class<?> clazz) {
        List<Field> fields = new ArrayList<>();

        // 递归地获取所有字段
        while (clazz != null) {
            for (Field field : clazz.getDeclaredFields()) {
                fields.add(field);
            }
            clazz = clazz.getSuperclass();
        }
        return fields;
    }

    /**
     * 获取一个类及其父类的所有的方法
     * @param clazz
     * @return
     */
    public static List<Method> getAllMethods(Class<?> clazz) {
        List<Method> methods = new ArrayList<>();
        // 递归地获取所有方法
        while (clazz != null) {
            for (Method method : clazz.getDeclaredMethods()) {
                methods.add(method);
            }
            clazz = clazz.getSuperclass();
        }

        return methods;
    }
}
